/* 进程 */
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h> 
#include <sys/wait.h>
#include <sys/stat.h> 
#include <fcntl.h> 
#include <stdlib.h>
#include <string.h>
#include <errno.h> 
#include <signal.h>

//注册进程正常终止的处理函数 -> 要求是exit()终止
static void bye(void) {
    printf("Over !\n");
}

static void chile_handler(int sig)
{
    int ret;
    while(1) {
        if((ret = waitpid(-1,NULL,WNOHANG)) > 0) {
            printf("为%d子进程收尸\n",ret);
            break;
        }
        continue;
    }
}

int main(int argc,char **argv)
{
    if(0 != atexit(bye)) {
        perror("atexit error");
        exit(-1);
    }
    /* 为SIGCHLD信号绑定处理函数 */ 
    struct sigaction sig = {0};
    sig.sa_handler = chile_handler;
    sig.sa_flags = 0;
    if(-1 == sigaction(SIGCHLD,&sig,NULL)) {
        perror("sigaction error");
        exit(-1);
    }

    printf("会话ID< %d >\n",getsid(0));

    /* 创建子进程 */ 
    switch (fork()) { 
    case -1: 
        perror("fork error"); 
        exit(-1); 

    case 0: 
        /* 子进程 */
        printf("子进程<%d>被创建\n", getpid()); 
        sleep(1);
        _exit(0);

    default: 
        /* 父进程 */ 
        break; 
    }

    sleep(5);

    exit(0);
}